/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package uy.edu.ort.proveedorservicios.persistencia;

import com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.datatype.XMLGregorianCalendar;
import uy.edu.ort.proveedorservicios.util.MensajesUtil;
import uy.edu.ort.uyviajes.ws.autorizacion.DatosTarjeta;
import uy.edu.ort.uyviajes.ws.paquetes.PaqueteTuristico;

/**
 *
 * @author magui
 */
public class Persistencia {
    
    private static Persistencia persistencia;
    private List<PaqueteTuristico> listaPaquetes;
    private List<DatosTarjeta> listaTarjetas;
    private int codigoAutorizacion;

    /**
     * 
     */
    private Persistencia() {
        listaPaquetes = new ArrayList<PaqueteTuristico>();
        listaTarjetas = new ArrayList<DatosTarjeta>();
        codigoAutorizacion = 1;
    }

    public static Persistencia getPersistencia() {
        if (persistencia == null) {
            inicializarPersistencia();
        }
        return persistencia;
    }
    
    private static void inicializarPersistencia(){
        persistencia = new Persistencia();
        inicializarPaquetes();
        inicializarDatosTarjeta();
    }
    
    private static void inicializarPaquetes(){
        
        try{
            //Paquete1
            PaqueteTuristico miPa = new PaqueteTuristico();
            miPa.setCodigo("UY000001");
            miPa.setOrigen("Buenos Aires");
            miPa.setDestino("Montevideo");
            miPa.setDescripcion("Montevideo los recibe con un cálido abrazo y el trato amable de sus ciudadanos, su excelente infraestructura y sus servicios, el cuidado del medioambiente");
            //Se generan fechas auxiliares para las pruebas
            XMLGregorianCalendar miFechaP = new XMLGregorianCalendarImpl(new GregorianCalendar(2011,06,23));
            XMLGregorianCalendar miFechaLl = new XMLGregorianCalendarImpl(new GregorianCalendar(2011,06,30));
            miPa.setFechaLlegada(miFechaLl);
            miPa.setFechaSalida(miFechaP);
            miPa.setCosto(200);
            persistencia.guardarPaquete(miPa);

            //Paquete 2
            PaqueteTuristico miPa2 = new PaqueteTuristico();
            miPa2.setCodigo("UY000002");
            miPa2.setOrigen("Montevideo");
            miPa2.setDestino("Nueva York");
            miPa2.setDescripcion("Fantástico viaje a New York, incluye excursiones para conocer las ex-torres gemelas, el Empire State y los restauranchis mais exclusive.");
            //Se generan fechas auxiliares para las pruebas
            miFechaP = new XMLGregorianCalendarImpl(new GregorianCalendar(2011,06,24));
            miFechaLl = new XMLGregorianCalendarImpl(new GregorianCalendar(2011,06,30));
            miPa2.setFechaLlegada(miFechaLl);
            miPa2.setFechaSalida(miFechaP);
            miPa2.setCosto(300);
            persistencia.guardarPaquete(miPa2);

            //Paquete 3
            PaqueteTuristico miPa3 = new PaqueteTuristico();
            miPa3.setCodigo("UY000003");
            miPa3.setOrigen("Montevideo");
            miPa3.setDestino("París");
            miPa3.setDescripcion("Viva el romance en la ciudad del amor! Conozca sus maravillas: Tour Eiffel, Montmartre, el Arco de Triunfo y Versailles.");
            //Se generan fechas auxiliares para las pruebas
            miFechaP = new XMLGregorianCalendarImpl(new GregorianCalendar(2011,07,21));
            miFechaLl = new XMLGregorianCalendarImpl(new GregorianCalendar(2011,07,30));
            miPa3.setFechaLlegada(miFechaLl);
            miPa3.setFechaSalida(miFechaP);
            miPa3.setCosto(1200);
            persistencia.guardarPaquete(miPa3);

            //Paquete 4
            PaqueteTuristico miPa4 = new PaqueteTuristico();
            miPa4.setCodigo("UY000004");
            miPa4.setOrigen("Montevideo");
            miPa4.setDestino("El Cairo");
            miPa4.setDescripcion("Increíble viaje a El Cairo. Incluye recorridos por el Valle de los Reyes, y un descenso por el Nilo.");
            //Se generan fechas auxiliares para las pruebas
            miFechaP = new XMLGregorianCalendarImpl(new GregorianCalendar(2011,07,15));
            miFechaLl = new XMLGregorianCalendarImpl(new GregorianCalendar(2011,07,30));
            miPa4.setFechaLlegada(miFechaLl);
            miPa4.setFechaSalida(miFechaP);
            miPa4.setCosto(1200);
            persistencia.guardarPaquete(miPa4);
        } catch (Exception ex) {
                    Logger.getLogger(Persistencia.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    private static void inicializarDatosTarjeta(){
        try{
            //Tarjeta1
            DatosTarjeta miTar = new DatosTarjeta();
            miTar.setCodigoSeguridad("336");
            miTar.setNombreTitular("Diego Berriel");
            miTar.setNumero("3322556645678787");
            miTar.setTipo("VISA");
            miTar.setVencimiento("11/2015");
            persistencia.guardarDatosTarjeta(miTar);
            
            //Tarjeta2
            DatosTarjeta miTar2 = new DatosTarjeta();
            miTar2.setCodigoSeguridad("123");
            miTar2.setNombreTitular("Magdalena Hourcade");
            miTar2.setNumero("3322556645678383");
            miTar2.setTipo("MASTERCARD");
            miTar2.setVencimiento("01/2016");
            persistencia.guardarDatosTarjeta(miTar2);
        
            //Tarjeta3
            DatosTarjeta miTar3 = new DatosTarjeta();
            miTar3.setCodigoSeguridad("555");
            miTar3.setNombreTitular("Magdalena Hourcade");
            miTar3.setNumero("8978552245678383");
            miTar3.setTipo("VISA");
            miTar3.setVencimiento("10/2010");
            persistencia.guardarDatosTarjeta(miTar3);
            
            //Tarjeta4
            DatosTarjeta miTar4 = new DatosTarjeta();
            miTar4.setCodigoSeguridad("965");
            miTar4.setNombreTitular("Diego Berriel");
            miTar4.setNumero("8978552276548285");
            miTar4.setTipo("VISA");
            miTar4.setVencimiento("10/2020");
            persistencia.guardarDatosTarjeta(miTar4);
            
        } catch (Exception ex) {
            Logger.getLogger(Persistencia.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     * 
     * @param nuevoPaquete
     * @exception Exception
     */
    public void guardarPaquete(PaqueteTuristico nuevoPaquete) throws Exception {
        if (!existePaquete(nuevoPaquete)) {
            this.listaPaquetes.add(nuevoPaquete);
        } else {
            String msgError = MensajesUtil.obtenerMensaje("PAQUETE_EXISTE", null);
            throw new Exception(msgError);
        }
    }

    /**
     * 
     * @param nuevaTarjeta
     * @exception Exception
     */
    public void guardarDatosTarjeta(DatosTarjeta nuevaTarjeta) throws Exception {
        if (!existeTarjeta(nuevaTarjeta)) {
            this.listaTarjetas.add(nuevaTarjeta);
        } else {
            String msgError = MensajesUtil.obtenerMensaje("TARJETA_EXISTE", null);
            throw new Exception(msgError);
        }
    }
    
    public List<PaqueteTuristico> getListaPaquetes() {
        return listaPaquetes;
    }
    
    public List<DatosTarjeta> getListaTarjetas(){
        return listaTarjetas;
    }

    /**
     * 
     * @param p
     * @return
     */
    private boolean existePaquete(PaqueteTuristico p) {
        boolean result = Boolean.FALSE;
        for (PaqueteTuristico paquete : this.listaPaquetes) {
            if (paquete.getCodigo().equals(p.getCodigo())) {
                return Boolean.TRUE;
            }
        }
        return result;
    }
    
    /**
     * 
     * @param t
     * @return
     */
    public boolean existeTarjeta(DatosTarjeta t) {
        boolean result = Boolean.FALSE;
        for (DatosTarjeta tarjeta : this.listaTarjetas) {
            if (tarjeta.getNumero().equals(t.getNumero()) && tarjeta.getCodigoSeguridad().equals(t.getCodigoSeguridad()) 
                    && tarjeta.getTipo().equals(t.getTipo()) && tarjeta.getNombreTitular().equals(t.getNombreTitular())
                    && tarjeta.getVencimiento().equals(t.getVencimiento())) {
                return Boolean.TRUE;
            }
        }
        return result;
    }
}
